// DataLibrary InterfacePlugin - Music

// 識別子：DL_MSC
// 内容  ：ミュージック。

//----------------------------------------------------------------------------//
// Plugin
//----------------------------------------------------------------------------//

//-- プラグインの読み込み処理 --//
DL_LoadInterface_Music:
	// 共有サブルーチンを読み込む
	Call DL_LoadInterface "Common"
	
	// サブインターフェースを読み込む
	Call DL_LoadInterface "Config"
	Call DL_LoadInterface "Help"
	
	// スキンを読み込む
	Call DL_LoadSkin "Music"
	
	// 演奏中の音楽ファイル名を格納する変数を設定する
	Set DL_PlayMusic ""
Return


//-- プラグインの終了処理 --//
DL_UnLoadInterface_Music:
	UnSet DL_PlayMusic
Return


//----------------------------------------------------------------------------//
// LibraryFile
//----------------------------------------------------------------------------//

//-- LoadLibraryFile_Music handle lib_id : ライブラリファイルを読み込む --//
DL_LoadLibraryFile_Music:
	Local F = Args(1)
	Local lib_id = Args(2)
	
	// アーカイブファイルとして読み込む
	If IsVarDefined(DL_ArchiveID[lib_id]) Then
		Call ("DL_LoadMusicArchive_" & DL_ArchiveID[lib_id]) lib_id
		Return
	EndIf
	
	// 通常のライブラリファイルとして読み込む
	Local read_data section key value lib_cnt
	Do While (EOF(F) = 0)
		read_data = DL_LineRead(F)
		
		If read_data = "" Then
			Skip  // 空行(コメント行も含む)はスキップする
		ElseIf DL_IsSectionLine(read_data) Then
			section = LCase(Mid(read_data, 2, Len(read_data) - 2))  // セクションを取り出す
			
			// 旧Verのデータを処理する
			If section != "datalist" Then
				section = Mid(read_data, 2, Len(read_data) - 2)
				Call DL_RegisterMusicItem lib_id section section "-.mid"
			EndIf
			Skip
		EndIf
		
		// キーと値に分割する
		If read_data Like "*=*" Then
			key = RegExpReplace(read_data, "^\s*(.*?)\s*=.*", "$1")
			value = RegExpReplace(read_data, ".*=\s*(.*?)\s*$", "$1")
		Else
			Skip  // 不完全なデータをスキップする
		EndIf
		
		// データを設定する
		Switch section
		Case "datalist"
			// ミュージックリストを設定する
			value = DL_ConvertListData(value, ",")
			Call DL_RegisterMusicItem lib_id key LIndex(value, 1) LIndex(value, 2)
		Case Else
			// 旧Verのデータを設定する
			If DL_GetFlag(section, lib_id) = 0 Then
				Skip
			EndIf
			
			// データを設定する
			lib_cnt = DL_LibCount[lib_id]
			Switch LCase(key)
			Case "name"
				Call DL_UpdateLibraryItem lib_id lib_cnt "" _
					("(" & value & ") (" & DL_GetLibItemData(lib_id, lib_cnt, 2) & ")")
			Case "file"
				Call DL_UpdateLibraryItem lib_id lib_cnt "" _
					("(" & DL_GetLibItemData(lib_id, lib_cnt, 1) & ") (" & value & ")")
			EndSw
		EndSW
	Loop
Return


//-- RegisterMusicItem lib_id data_id title file : ミュージック用の項目データを登録する --//
DL_RegisterMusicItem:
	Local title = IIf(Args(3) != "", Args(3) , Args(2))
	Call DL_RegisterLibraryItem Args(1) Args(2) ("(" & title & ") (" & Args(4) & ")")
Return


//----------------------------------------------------------------------------//
// Interface-Music
//----------------------------------------------------------------------------//

//-- GUI_Music : インターフェースを開始する --//
DL_GUI_Music:
	// 演奏中の項目番号を設定する
	Set DL_MSC_MusicID DL_MSC_GetPlayMusicID(DL_ShowLib)
	
	// インターフェースを表示する
	Call DL_MSC_SkinAction "StartInterface"
	Show
	Do
		Call DL_CMN_WaitAction
	Loop While DL_MSC_InterfaceAction(DL_CMN_ActionID)
	
	// インターフェースを終了する
	Call DL_MSC_SkinAction "EndInterface"
	
	// BGMを元に戻す
	If (DL_GetOptionValue("KeepMusic", 0) = 0) And (DL_PlayMusic != "") Then
		StopBGM
		Call DL_PlaySound_BGM
		Set DL_PlayMusic ""
	EndIf
	
	// 使用変数を削除する
	UnSet DL_MSC_MusicID
Return


//-- InterfaceAction action_id : 動作を実行する。ループ続行なら1を返す --//
DL_MSC_InterfaceAction:
	Local action_id = Args(1)
	Switch LIndex(action_id, 1)
	Case "Music"
		Local item_num = LIndex(action_id, 2)
		Local file = DL_GetLibItemData(DL_ShowLib, item_num, 2)
		
		// 未読の強調表示を解除する
		Call DL_SetLibItemUnread DL_ShowLib DL_GetLibItemID(DL_ShowLib, item_num) 0
		
		Call DL_PlaySound_Click
		Call DL_MSC_SkinAction "SelectMusic" action_id
		
		// 指定された項目を演奏する
		StopBGM
		If DL_PlayMusic != file Then
			StartBGM file
			Set DL_PlayMusic file
			Set DL_MSC_MusicID item_num
		Else
			Call DL_PlaySound_BGM
			Set DL_PlayMusic ""
			Set DL_MSC_MusicID 0
		EndIf
		Return 1
	Case "Scroll"
		// スクロール用の汎用処理を呼び出す
		Return DL_CMN_ScrollAction(action_id, "MSC")
	Case "Help" "Config"
		// サブインターフェース用の汎用処理を呼び出す
		Return DL_CMN_SubInterfaceAction(action_id, "MSC")
	Case "Return" "Cancel"
		// 戻る用の汎用処理を呼び出す
		Return DL_CMN_ReturnAction(action_id, "MSC", "Index")
	Case "Index"
		// 戻る用の汎用処理を呼び出す(インデックス直帰)
		Return DL_CMN_IndexAction(action_id, "MSC")
	Case "Quit"
		// 終了用の汎用処理呼び出す 
		Return DL_CMN_QuitAction(action_id, "MSC")
	Case Else
		// 未設定動作用の汎用処理を呼び出す
		Return DL_CMN_NotDefinedAction(action_id, "MSC")
	EndSw
Return 1


//----------------------------------------------------------------------------//
// Subroutine
//----------------------------------------------------------------------------//

//-- GetPlayMusicID(lib_id) : 演奏中の項目の番号を返す --//
DL_MSC_GetPlayMusicID:
	If DL_PlayMusic = "" Then
		Return 0
	EndIf
	
	Local lib_id = Args(1)
	Local i
	For i = 1 To DL_LibCount[lib_id]
		If DL_PlayMusic = DL_GetLibItemData(lib_id, i, 2) Then
			Return i
		EndIf
	Next
Return 0


